/**
 * Clasa Radical se refera la functia radical. f(x)=sqrt(x);
 * Derivata functiei este f'(x)=1/2*sqrt(x);
 */

package q10.Functii.FunctiiElementare;
import q10.Operatori.Produs;
import q10.Functii.*;
import q10.Operatori.*;
public class Radical extends Functie {
	
	/**Metoda calcul() returneaza valoarea functiei apeland functia Calcul(double x)
	 * @return double
	 */
	public double calcul()
		{
		if (fStang==null)
			System.exit(1);
		return Calcul(fStang.calcul());
		}
	
	/**Metoda Calcul(double x) returneaza valoarea functiei sqrt(x)
	 * 
	 * @param x	valoarea lui x din sqrt(x)
	 * @return double
	 */
	public static double Calcul(double x)
		{
		return Math.sqrt(x);
		}
	
	/**
	 * Metoda derivare returneaza String-ul rezultat derivarii functiei Radical
	 * @return String
	 */
	public String derivare()
		{
		if(fStang==null)
			System.exit(1);
		return Produs.concatTermens(Cat.concatTermens("1", "2"),"sqrt("+fStang+")");
		}
	
	/**Metoda calculDerivata() returneaza valoarea derivatei functiei radical. Aceasta apeleaza metoda Calcul
	 * din clasa Produs si Calcul din clasa Cat;
	 * @return double
	 */
	public double calculDerivata()
		{
		if (fStang==null)
		System.exit(1);
		return Produs.Calcul(Cat.Calcul(1, 2),fStang.calculDerivata());
		}
	
	/**Metoda concatTermeni(string aux) concateneaza termenii a.i. sa poate fi afisata functia
	 * 
	 * @param aux1	x din sqrt(x)
	 * @return String
	 */
	public static String concatTermeni(String aux1)
		{
		String aux;
		int nrP= aux1.charAt(0) == '(' ? 0 : 2;
		aux="sqrt";
		if (nrP!=0)
			aux=aux+"(";
		aux=aux+aux1;
		if (nrP!=0)
			aux=aux+")";
		return aux;
		}
	
	/**Metoda toString afiseaza functia ca si String;
	 * @return String
	 */
	public String toString() {
	if (fStang == null)
	    System.exit(1);
	
	return concatTermeni(fStang.toString());
	}	

}
